package com.itlaobing.aop.concepts;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class CalculatableTest2 {

    public static void main(String[] args) throws Exception {

        //代理目标（proxy target）
        final Calculatable target = new Calculator();

        Class<?> tc = target.getClass();
        ClassLoader loader = tc.getClassLoader();
        Class<?>[] interfaces = tc.getInterfaces();

        InvocationHandler handler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Object result = null;
                String methodName = method.getName();
                try {
                    // 方位：方法执行前（before）
                    System.out.println("方法[" +methodName+"]即将执行");// 我们需要添加的代码被称作 Advice
                    result = method.invoke(target,args);//execution point
                    // 方位：方法返回后（after-return）
                    System.out.println( "方法[" + methodName + "]返回了["+ result +"]" ); // 我们需要添加的代码被称作 Advice
                }catch (Exception e){
                    // 方位: 方法抛出异常后 ( after-throw )
                    System.out.println( "方法[" + methodName + "]抛出异常["+ e.toString() +"]" ); // 我们需要添加的代码被称作 Advice
                    e.printStackTrace(); // 我们需要添加的代码被称作 Advice
                } finally {
                    // 方位: 方法执行后 ( after )
                    System.out.println( "方法[" + methodName + "]执行结束" ); // 我们需要添加的代码被称作 Advice
                }
                return result;
            }
        };
        Object proxy = Proxy.newProxyInstance(loader ,interfaces ,handler);

        String desc = proxy.toString();
        System.out.println(desc);

        if (proxy instanceof Calculatable){
            Calculatable c = (Calculatable) proxy;
            long result = c.divide(15,3);
            System.out.println(result);
        }
    }
}
